/**
 * 认证中间件
 * 用于验证用户的身份认证状态
 * 
 * 功能：
 * 1. 从请求头中提取JWT令牌
 * 2. 验证令牌的有效性
 * 3. 查找并验证用户
 * 4. 将用户信息附加到请求对象
 */

const jwt = require('jsonwebtoken');
const User = require('../models/user.model');

/**
 * 认证中间件函数
 * 验证请求中的JWT令牌并确保用户已登录
 * 
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express next中间件函数
 * 
 * 使用方式：
 * 1. 从请求头的Authorization字段获取Bearer令牌
 * 2. 验证令牌的有效性
 * 3. 查找对应的用户
 * 4. 如果验证成功，将用户信息附加到req对象
 * 5. 如果验证失败，返回401未授权错误
 */
const auth = async (req, res, next) => {
  try {
    // 从请求头中提取Bearer令牌
    const token = req.header('Authorization')?.replace('Bearer ', '');
    
    if (!token) {
      throw new Error('未提供认证令牌');
    }

    // 验证令牌并解码
    const decoded = jwt.verify(token, process.env.JWT_SECRET);
    const user = await User.findById(decoded.id);

    if (!user) {
      throw new Error('用户不存在');
    }

    // 将用户信息和令牌附加到请求对象
    req.user = user;
    req.token = token;
    next();
  } catch (error) {
    res.status(401).json({ message: '请先登录' });
  }
};

module.exports = auth;
